home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / mtd / onenand.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  5.9 KB  |  194 lines

  1. /*
  2.  *  linux/include/linux/mtd/onenand.h
  3.  *
  4.  *  Copyright (C) 2005-2007 Samsung Electronics
  5.  *  Kyungmin Park <kyungmin.park@samsung.com>
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 2 as
  9.  * published by the Free Software Foundation.
  10.  */
  11.  
  12. #ifndef __LINUX_MTD_ONENAND_H
  13. #define __LINUX_MTD_ONENAND_H
  14.  
  15. #include <linux/spinlock.h>
  16. #include <linux/completion.h>
  17. #include <linux/mtd/onenand_regs.h>
  18. #include <linux/mtd/bbm.h>
  19.  
  20. #define MAX_BUFFERRAM        2
  21.  
  22. /* Scan and identify a OneNAND device */
  23. extern int onenand_scan(struct mtd_info *mtd, int max_chips);
  24. /* Free resources held by the OneNAND device */
  25. extern void onenand_release(struct mtd_info *mtd);
  26.  
  27. /*
  28.  * onenand_state_t - chip states
  29.  * Enumeration for OneNAND flash chip state
  30.  */
  31. typedef enum {
  32.     FL_READY,
  33.     FL_READING,
  34.     FL_WRITING,
  35.     FL_ERASING,
  36.     FL_SYNCING,
  37.     FL_LOCKING,
  38.     FL_RESETING,
  39.     FL_OTPING,
  40.     FL_PM_SUSPENDED,
  41. } onenand_state_t;
  42.  
  43. /**
  44.  * struct onenand_bufferram - OneNAND BufferRAM Data
  45.  * @blockpage:        block & page address in BufferRAM
  46.  */
  47. struct onenand_bufferram {
  48.     int    blockpage;
  49. };
  50.  
  51. /**
  52.  * struct onenand_chip - OneNAND Private Flash Chip Data
  53.  * @base:        [BOARDSPECIFIC] address to access OneNAND
  54.  * @chipsize:        [INTERN] the size of one chip for multichip arrays
  55.  * @device_id:        [INTERN] device ID
  56.  * @density_mask:    chip density, used for DDP devices
  57.  * @verstion_id:    [INTERN] version ID
  58.  * @options:        [BOARDSPECIFIC] various chip options. They can
  59.  *            partly be set to inform onenand_scan about
  60.  * @erase_shift:    [INTERN] number of address bits in a block
  61.  * @page_shift:        [INTERN] number of address bits in a page
  62.  * @page_mask:        [INTERN] a page per block mask
  63.  * @writesize:        [INTERN] a real page size
  64.  * @bufferram_index:    [INTERN] BufferRAM index
  65.  * @bufferram:        [INTERN] BufferRAM info
  66.  * @readw:        [REPLACEABLE] hardware specific function for read short
  67.  * @writew:        [REPLACEABLE] hardware specific function for write short
  68.  * @command:        [REPLACEABLE] hardware specific function for writing
  69.  *            commands to the chip
  70.  * @wait:        [REPLACEABLE] hardware specific function for wait on ready
  71.  * @read_bufferram:    [REPLACEABLE] hardware specific function for BufferRAM Area
  72.  * @write_bufferram:    [REPLACEABLE] hardware specific function for BufferRAM Area
  73.  * @read_word:        [REPLACEABLE] hardware specific function for read
  74.  *            register of OneNAND
  75.  * @write_word:        [REPLACEABLE] hardware specific function for write
  76.  *            register of OneNAND
  77.  * @mmcontrol:        sync burst read function
  78.  * @block_markbad:    function to mark a block as bad
  79.  * @scan_bbt:        [REPLACEALBE] hardware specific function for scanning
  80.  *            Bad block Table
  81.  * @chip_lock:        [INTERN] spinlock used to protect access to this
  82.  *            structure and the chip
  83.  * @wq:            [INTERN] wait queue to sleep on if a OneNAND
  84.  *            operation is in progress
  85.  * @state:        [INTERN] the current state of the OneNAND device
  86.  * @page_buf:        [INTERN] page main data buffer
  87.  * @oob_buf:        [INTERN] page oob data buffer
  88.  * @subpagesize:    [INTERN] holds the subpagesize
  89.  * @ecclayout:        [REPLACEABLE] the default ecc placement scheme
  90.  * @bbm:        [REPLACEABLE] pointer to Bad Block Management
  91.  * @priv:        [OPTIONAL] pointer to private chip date
  92.  */
  93. struct onenand_chip {
  94.     void __iomem        *base;
  95.     unsigned int        chipsize;
  96.     unsigned int        device_id;
  97.     unsigned int        version_id;
  98.     unsigned int        density_mask;
  99.     unsigned int        options;
  100.  
  101.     unsigned int        erase_shift;
  102.     unsigned int        page_shift;
  103.     unsigned int        page_mask;
  104.     unsigned int        writesize;
  105.  
  106.     unsigned int        bufferram_index;
  107.     struct onenand_bufferram    bufferram[MAX_BUFFERRAM];
  108.  
  109.     int (*command)(struct mtd_info *mtd, int cmd, loff_t address, size_t len);
  110.     int (*wait)(struct mtd_info *mtd, int state);
  111.     int (*read_bufferram)(struct mtd_info *mtd, int area,
  112.             unsigned char *buffer, int offset, size_t count);
  113.     int (*write_bufferram)(struct mtd_info *mtd, int area,
  114.             const unsigned char *buffer, int offset, size_t count);
  115.     unsigned short (*read_word)(void __iomem *addr);
  116.     void (*write_word)(unsigned short value, void __iomem *addr);
  117.     void (*mmcontrol)(struct mtd_info *mtd, int sync_read);
  118.     int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
  119.     int (*scan_bbt)(struct mtd_info *mtd);
  120.  
  121.     struct completion    complete;
  122.     int            irq;
  123.  
  124.     spinlock_t        chip_lock;
  125.     wait_queue_head_t    wq;
  126.     onenand_state_t        state;
  127.     unsigned char        *page_buf;
  128.     unsigned char        *oob_buf;
  129.  
  130.     int            subpagesize;
  131.     struct nand_ecclayout    *ecclayout;
  132.  
  133.     void            *bbm;
  134.  
  135.     void            *priv;
  136. };
  137.  
  138. /*
  139.  * Helper macros
  140.  */
  141. #define ONENAND_CURRENT_BUFFERRAM(this)        (this->bufferram_index)
  142. #define ONENAND_NEXT_BUFFERRAM(this)        (this->bufferram_index ^ 1)
  143. #define ONENAND_SET_NEXT_BUFFERRAM(this)    (this->bufferram_index ^= 1)
  144. #define ONENAND_SET_PREV_BUFFERRAM(this)    (this->bufferram_index ^= 1)
  145. #define ONENAND_SET_BUFFERRAM0(this)        (this->bufferram_index = 0)
  146. #define ONENAND_SET_BUFFERRAM1(this)        (this->bufferram_index = 1)
  147.  
  148. #define ONENAND_GET_SYS_CFG1(this)                    \
  149.     (this->read_word(this->base + ONENAND_REG_SYS_CFG1))
  150. #define ONENAND_SET_SYS_CFG1(v, this)                    \
  151.     (this->write_word(v, this->base + ONENAND_REG_SYS_CFG1))
  152.  
  153. #define ONENAND_IS_DDP(this)                        \
  154.     (this->device_id & ONENAND_DEVICE_IS_DDP)
  155.  
  156. #ifdef CONFIG_MTD_ONENAND_2X_PROGRAM
  157. #define ONENAND_IS_2PLANE(this)                        \
  158.     (this->options & ONENAND_HAS_2PLANE)
  159. #else
  160. #define ONENAND_IS_2PLANE(this)            (0)
  161. #endif
  162.  
  163. /* Check byte access in OneNAND */
  164. #define ONENAND_CHECK_BYTE_ACCESS(addr)        (addr & 0x1)
  165.  
  166. /*
  167.  * Options bits
  168.  */
  169. #define ONENAND_HAS_CONT_LOCK        (0x0001)
  170. #define ONENAND_HAS_UNLOCK_ALL        (0x0002)
  171. #define ONENAND_HAS_2PLANE        (0x0004)
  172. #define ONENAND_PAGEBUF_ALLOC        (0x1000)
  173. #define ONENAND_OOBBUF_ALLOC        (0x2000)
  174.  
  175. /*
  176.  * OneNAND Flash Manufacturer ID Codes
  177.  */
  178. #define ONENAND_MFR_SAMSUNG    0xec
  179.  
  180. /**
  181.  * struct onenand_manufacturers - NAND Flash Manufacturer ID Structure
  182.  * @name:    Manufacturer name
  183.  * @id:        manufacturer ID code of device.
  184. */
  185. struct onenand_manufacturers {
  186.         int id;
  187.         char *name;
  188. };
  189.  
  190. int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
  191.              struct mtd_oob_ops *ops);
  192.  
  193. #endif    /* __LINUX_MTD_ONENAND_H */
  194.